To pytanie ma już odpowiedzi tutaj: Brak niejawnej konwersji w przeciążonym operatorze (2 odpowiedzi) Zamknięte 7 lat temu. Piszę proste opakowanie dla typu elementarnego i staram się uniknąć konieczności pisania zbyt wielu rodzajów standardowych operatorów. Miałem nadzieję, że niejawna konwersja typów pomoże, ale tak nie jest. Oto uproszczony przykład: struct Int { int _i; Int (int i = 0): _i {i} {} Operator int + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (nieważne) (Int (1) + 2); // W porządku (nieważne) (2 + Int (1)); // błąd: nieprawidłowe operandy w wyrażeniu binarnym („int” i „Int”) } Używam llvm. Pierwsza linia głównej kompilacji dobrze się kompiluje. Drugi powoduje błąd. Teraz miałem nadzieję, że wydarzy się w drugiej linii, że 2 zostanie niejawnie przekonwertowane na Int (2), po czym nastąpi wywołanie operatora +. Dlaczego tak się nie dzieje? Dlaczego niejawna konwersja ma miejsce w pierwszym wierszu?
2021-03-01 08:19:55
Dzieje się to w pierwszym wierszu, ponieważ jedynym dostępnym operatorem + jest operator + (Int &) (który ma niejawny pierwszy parametr Int dla tego wystąpienia). Druga linia kończy się niepowodzeniem, ponieważ pierwszy parametr to int i nie ma pojęcia, że musi go przekonwertować przed próbą wykonania operacji (nie wie, że musi użyć Int :: operator +). Możesz uniknąć tego problemu, czyniąc z operatora funkcję przyjaciela niebędącego członkiem (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} przyjaciel Operator Int + (const Int & lhs, const Int & rhs); }; Operator int + (const Int & lhs, const Int & rhs) { return lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; return 0; } | Nie szukasz odpowiedzi? Przejrzyj inne pytania oznaczone tagiem c ++ operator-słowo kluczowe niejawna konwersja lub zadaj własne pytanie.